 /*******************************************************************************
  * Copyright (c) 2003, 2005 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
  * Contributors:
  * IBM Corporation - Initial API and implementation
  *******************************************************************************/
 package org.eclipse.ui.internal.browser;

 import java.util.ArrayList ;
 import java.util.List ;

 import org.eclipse.core.runtime.IConfigurationElement;
 import org.eclipse.core.runtime.IExtensionRegistry;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Platform;
 import org.eclipse.core.runtime.Status;
 import org.eclipse.ui.plugin.AbstractUIPlugin;
 import org.osgi.framework.BundleContext;
 /**
  * The main web browser plugin class.
  */
 public class WebBrowserUIPlugin extends AbstractUIPlugin {
     // Web browser plugin id
 public static final String PLUGIN_ID = "org.eclipse.ui.browser"; //$NON-NLS-1$

     // singleton instance of this class
 private static WebBrowserUIPlugin singleton;
     
     // cached copy of all browsers
 private static List browsers;

     /**
      * Create the WebBrowserUIPlugin
      */
     public WebBrowserUIPlugin() {
         super();
         singleton = this;
     }

     /**
      * Returns the singleton instance of this plugin.
      *
      * @return org.eclipse.ui.internal.browser.WebBrowserPlugin
      */
     public static WebBrowserUIPlugin getInstance() {
         return singleton;
     }

     /**
      * Shuts down this plug-in and saves all plug-in state.
      *
      * @exception Exception
      */
     public void stop(BundleContext context) throws Exception {
         super.stop(context);
         BrowserManager.safeDispose();
     }
     
     /**
      * Returns an array of all known browers.
      * <p>
      * A new array is returned on each call, so clients may store or modify the result.
      * </p>
      *
      * @return a possibly-empty array of browser instances {@link IClient}
      */
     public static IBrowserExt[] getBrowsers() {
         if (browsers == null)
             loadBrowsers();
         IBrowserExt[] c = new IBrowserExt[browsers.size()];
         browsers.toArray(c);
         return c;
     }
     
     public static IBrowserExt findBrowsers(String executable) {
         IBrowserExt[] browsers2 = getBrowsers();
         if (browsers2 == null || executable == null)
             return null;
         
         int ind1 = executable.lastIndexOf("/"); //$NON-NLS-1$
 int ind2 = executable.lastIndexOf("\\"); //$NON-NLS-1$
 if (ind2 > ind1)
             ind1 = ind2;
         executable = executable.substring(ind1 + 1);
         
         String os = Platform.getOS();
         int size = browsers2.length;
         for (int i = 0; i < size; i++) {
             if (browsers2[i].getOS().toLowerCase().indexOf(os) != -1) {
                 if (browsers2[i].isAvailable()) {
                     String executable2 = browsers2[i].getExecutable();
                     if (executable.startsWith(executable2))
                         return browsers2[i];
                 }
             }
         }
         return null;
     }
     
     /**
      * Load the browsers extension point.
      */
     private static synchronized void loadBrowsers() {
         if (browsers != null)
             return;
         Trace.trace(Trace.CONFIG, "->- Loading .browsers extension point ->-"); //$NON-NLS-1$
 IExtensionRegistry registry = Platform.getExtensionRegistry();
         IConfigurationElement[] cf = registry.getConfigurationElementsFor(PLUGIN_ID, "browsers"); //$NON-NLS-1$

         int size = cf.length;
         browsers = new ArrayList (size);
         for (int i = 0; i < size; i++) {
             try {
                 browsers.add(new BrowserExt(cf[i]));
                 Trace.trace(Trace.CONFIG, " Loaded browser: " + cf[i].getAttribute("id")); //$NON-NLS-1$ //$NON-NLS-2$
 } catch (Throwable t) {
                 Trace.trace(Trace.SEVERE, " Could not load browser: " + cf[i].getAttribute("id"), t); //$NON-NLS-1$ //$NON-NLS-2$
 }
         }
         Trace.trace(Trace.CONFIG, "-<- Done loading .browsers extension point -<-"); //$NON-NLS-1$
 }
     
     /**
      * Logs an Error message with an exception. Note that the message should
      * already be localized to proper locale. ie: Resources.getString() should
      * already have been called
      */
     public static synchronized void logError(String message, Throwable ex) {
         if (message == null)
             message = ""; //$NON-NLS-1$
 Status errorStatus = new Status(IStatus.ERROR, PLUGIN_ID, IStatus.OK,
                 message, ex);
         WebBrowserUIPlugin.getInstance().getLog().log(errorStatus);
     }

     /**
      * Logs a Warning message with an exception. Note that the message should
      * already be localized to proper local. ie: Resources.getString() should
      * already have been called
      */
     /*public static synchronized void logWarning(String message) {
         if (WebBrowserUIPlugin.DEBUG) {
             if (message == null)
                 message = ""; //$NON-NLS-1$
             Status warningStatus = new Status(IStatus.WARNING, PLUGIN_ID,
                     IStatus.OK, message, null);
             WebBrowserUIPlugin.getInstance().getLog().log(warningStatus);
         }
     }*/
 }
